#include "../lvgl/lvgl.h"
#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h> // 使用标准的 malloc 和 free 函数

// 双向链表节点，用于存储图片路径
typedef struct image_node_t {
    char *file_path;
    struct image_node_t *prev; // 指向上一个节点
    struct image_node_t *next; // 指向下一个节点
} image_node_t;

// 定义为 static，意味着这些变量只在本文件内部可见，不会影响其他模块
static image_node_t *image_list_head = NULL;    // 链表头节点
static image_node_t *current_image_node = NULL; // 指向当前正在显示的节点

// UI控件的指针，同样设为 static，方便在回调函数中安全地访问
static lv_obj_t *img_viewer;
static lv_obj_t *gif_viewer;
static lv_obj_t *path_label;



/**
 * @brief 检查文件名后缀是否为支持的图片格式
 */
static bool is_image_file(const char *filename) {
    const char *ext = lv_fs_get_ext(filename);
    if (ext == NULL) return false;

    // strcasecmp 不区分大小写比较 (e.g. "JPG" 和 "jpg" 都能识别)
    if (strcasecmp(ext, "jpg") == 0 || strcasecmp(ext, "jpeg") == 0 ||
        strcasecmp(ext, "png") == 0 || strcasecmp(ext, "bmp") == 0 ||
        strcasecmp(ext, "gif") == 0) {
        return true;
    }
    return false;
}

/**
 * @brief 扫描指定目录，使用“尾插法”构建图片路径的双向链表
 */
/**
 * @brief 扫描指定目录，使用“尾插法”构建图片路径的双向链表
 *        (此版本完全使用原生Linux API，绕过LVGL的文件系统封装)
 */
/**
 * @brief 【最终修正】扫描指定目录，并构建带有驱动器号的完整路径
 */
static void scan_image_files(const char *path) {
    DIR *dir;
    struct dirent *entry;

    dir = opendir(path);
    if (dir == NULL) {
        LV_LOG_ERROR("错误: 原生 opendir('%s') 失败! 原因: %s", path, strerror(errno));
        return;
    }

    LV_LOG_USER("成功打开目录 '%s'，开始扫描文件...", path);

    image_node_t *last_node = NULL;

    while ((entry = readdir(dir)) != NULL) {
        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
            continue;
        }

        if (is_image_file(entry->d_name)) {
            // --- 【核心修正点在这里！】 ---
            // 我们现在要构建一个 LVGL 认识的路径，格式是 "S:/path/to/file.jpg"
            char full_path_for_lvgl[512];
            
            // 使用你在 lv_conf.h 中定义的那个驱动器号，这里是 'S'
            // 注意格式是 "S:" + path + "/" + filename
            sprintf(full_path_for_lvgl, "S:%s/%s", path, entry->d_name);
            
            // 内存分配和尾插法逻辑
            image_node_t *new_node = (image_node_t *)malloc(sizeof(image_node_t));
            if(!new_node) continue;
            new_node->file_path = (char *)malloc(strlen(full_path_for_lvgl) + 1);
            if(!new_node->file_path) { free(new_node); continue; }
            strcpy(new_node->file_path, full_path_for_lvgl); // 把带驱动器号的路径存入链表
            new_node->next = NULL;

            if (image_list_head == NULL) {
                image_list_head = new_node;
                new_node->prev = NULL;
            } else {
                last_node->next = new_node;
                new_node->prev = last_node;
            }
            last_node = new_node;
            LV_LOG_INFO("找到图片,为LVGL准备的路径: %s", full_path_for_lvgl);
        }
    }

    closedir(dir);
    current_image_node = image_list_head;
}
/**
 * @brief 根据 current_image_node 的数据，刷新UI界面
 */
static void update_display() {
      if (current_image_node == NULL || current_image_node->file_path == NULL) {
        lv_label_set_text(path_label, "未找到任何图片。");
        lv_obj_add_flag(img_viewer, LV_OBJ_FLAG_HIDDEN);
        lv_obj_add_flag(gif_viewer, LV_OBJ_FLAG_HIDDEN);
        return;
    }
    char*path = current_image_node->file_path;
    //这个函数是用来获取后缀extension拓展名
    char*ext = lv_fs_get_ext(path);

    //lv_label_set_text

       if (ext && strcasecmp(ext, "gif") == 0) {
        // --- 如果是 GIF 文件 ---

        // --- 你的验证方法 ---
    printf("Debug: aponteiro gif_viewer: %p\n", gif_viewer);
    fflush(stdout); // 确保在崩溃前能把信息打印出来

    LV_LOG_USER("显示 GIF: %s", path);
    lv_gif_set_src(gif_viewer, path);
        LV_LOG_USER("显示 GIF: %s", path);

        lv_gif_set_src(gif_viewer, path); // 把路径设置给 GIF 控件
        lv_obj_clear_flag(gif_viewer, LV_OBJ_FLAG_HIDDEN);      // 显示 GIF 控件
        lv_obj_add_flag(img_viewer, LV_OBJ_FLAG_HIDDEN); // 隐藏静态图片控件
    } else {
        // --- 如果是静态图片 (JPG, PNG, BMP) ---
        LV_LOG_USER("显示静态图片: %s", path);
        lv_img_set_src(img_viewer, path); // 把路径设置给 IMG 控件
        lv_obj_clear_flag(img_viewer, LV_OBJ_FLAG_HIDDEN); // 显示静态图片控件
        lv_obj_add_flag(gif_viewer, LV_OBJ_FLAG_HIDDEN);          // 隐藏 GIF 控件
    }
}


/**
 * @brief 导航按钮的事件回调函数，处理链表遍历
 */
static void navigation_event_handler(lv_event_t *e) {
    if (lv_event_get_code(e) != LV_EVENT_CLICKED) return;
    if (current_image_node == NULL) return; // 如果列表为空，不执行任何操作

    // 从 user_data 获取导航方向: -1 表示上一张, 1 表示下一张
    int direction = (intptr_t)lv_event_get_user_data(e);

    if (direction == 1) { // --- 下一张 ---
        if (current_image_node->next != NULL) {
            current_image_node = current_image_node->next;
        } else { // 循环播放
            current_image_node = image_list_head;
        }
    } else if (direction == -1) { // --- 上一张 ---
        if (current_image_node->prev != NULL) {
            current_image_node = current_image_node->prev;
        } else { // 循环播放
            // 移动到链表尾部
            while (current_image_node->next != NULL) {
                current_image_node = current_image_node->next;
            }
        }
    }
    
    update_display(); // 更新UI显示
}


/**
 * @brief 创建图片浏览器的所有UI控件
 */
static void create_image_viewer_ui(void) {
    lv_obj_t *scr = lv_scr_act();
    lv_obj_clean(scr); // 清空屏幕，为新界面做准备

    // 创建图片显示控件
    img_viewer = lv_img_create(scr);
    lv_obj_center(img_viewer);

    //创建动画控件
    gif_viewer = lv_img_create(scr);
    lv_obj_center(gif_viewer);

    //默认刚开始时全部隐藏
    lv_obj_add_flag(img_viewer,LV_OBJ_FLAG_HIDDEN);
    lv_obj_add_flag(gif_viewer,LV_OBJ_FLAG_HIDDEN);

    // 创建路径显示标签
    path_label = lv_label_create(scr);
    lv_obj_set_width(path_label, LV_PCT(95)); // 宽度为屏幕的95%
    lv_label_set_long_mode(path_label, LV_LABEL_LONG_SCROLL_CIRCULAR);
    lv_obj_align(path_label, LV_ALIGN_BOTTOM_MID, 0, -10);
    lv_obj_set_style_text_align(path_label, LV_TEXT_ALIGN_CENTER, 0);

    // 创建“上一张”按钮
    lv_obj_t *btn_prev = lv_btn_create(scr);
    lv_obj_align(btn_prev, LV_ALIGN_LEFT_MID, 10, 0);
    lv_obj_add_event_cb(btn_prev, navigation_event_handler, LV_EVENT_CLICKED, (void *)-1);
    lv_obj_t *label_prev = lv_label_create(btn_prev);
    lv_label_set_text(label_prev, LV_SYMBOL_PREV);
    lv_obj_center(label_prev);

    // 创建“下一张”按钮
    lv_obj_t *btn_next = lv_btn_create(scr);
    lv_obj_align(btn_next, LV_ALIGN_RIGHT_MID, -10, 0);
    lv_obj_add_event_cb(btn_next, navigation_event_handler, LV_EVENT_CLICKED, (void *)1);
    lv_obj_t *label_next = lv_label_create(btn_next);
    lv_label_set_text(label_next, LV_SYMBOL_NEXT);
    lv_obj_center(label_next);
}

void create_image_viewer_app(const char *image_dir) {
    LV_LOG_USER("启动图片浏览器，扫描目录: %s", image_dir);
    
    scan_image_files(image_dir); // 1. 扫描文件，建立数据模型
    create_image_viewer_ui();    // 2. 创建UI界面
    update_display();            // 3. 用初始数据刷新UI

}